home *** CD-ROM | disk | FTP | other *** search
/ Sun Solutions 1997 April to September / Sun Solutions CD - APR '97 - SEP '97 (704-3778-12 Rev. H)(Sun Microsystems, Inc.)(1997).iso / products / bin / httpd / Solaris_2 / AT-config.cgi < prev    next >
Text File  |  1997-02-25  |  32KB  |  896 lines

  1. #!/bin/sh
  2. perl=/tmp/httpd/.excite/perl
  3. eval "exec $perl -x $0 $*"
  4. #!perl
  5. ## Copyright (c) 1996 Excite, Inc.
  6. ##
  7. ## This CGI script allows users to configure Excite, Inc. databases
  8. ## through a WWW interface. Naturally, there are plenty of security
  9. ## concerns associated with this scheme.
  10. ##
  11. ## This script appears as several different web pages, depending on
  12. ## its invocation. If invoked with a 'db=<database>' argument, the
  13. ## script prints out the configuration information for a particular
  14. ## database and then allows the user to change it. If invoked with
  15. ## 'new=<database>', the user is allowed to create a new database. If
  16. ## invoked with 'Update=Update' and 'dbname=<database>', it updates an
  17. ## existing database configuration file. Without any of these
  18. ## arguments, it displays a list of currently existing database.conf
  19. ## files, and also allows the user to create a new database.conf file.
  20.  
  21. BEGIN {
  22.   $root = "/tmp/httpd/.excite";
  23.   $perlportname = "sun4-solaris";
  24.   die "Invalid root directory '$root'\n" unless -d $root;
  25.   unshift(@INC, "$root/perllib", "$root/perllib/$perlportname/5.002",
  26.       "$root/perllib/$perlportname");
  27. }
  28.  
  29. require 'os_functions.pl';
  30. require 'architext.pl';
  31. require 'architextConf.pl';
  32. require 'architextNotify.pl';
  33. require 'architext_map.pl';
  34.  
  35. %form = &Architext'readFormArgs;
  36. %attr = &ArchitextConf'readConfig("$root/Architext.conf", $form{'db'});
  37.  
  38. if (&Architext'remoteMode($root)) {
  39.     $helppath = &Architext'helpPath();
  40. } else {
  41.     $helppath = $attr{'ArchitextURL'};
  42. }
  43.  
  44. $script_suffix = &Architext'scriptSuffix();
  45. $scriptname = "AT-config$script_suffix";
  46.  
  47. ## check for password, if one is specified in Architext.conf
  48. ## if it doesn't appear as a form arg, present password page
  49. $password = &Architext'password($attr{'ArchitextURL'},
  50.                 $scriptname,
  51.                 $attr{'Password'}, 
  52.                 %form) if $attr{'Password'};
  53.  
  54. $postpass = 
  55.     "<INPUT TYPE=\"hidden\" NAME=\"$password\" VALUE=\"$attr{'Password'}\">" if
  56.     ($attr{'Password'});
  57. $getpass = "?$password=$attr{'Password'}" if $postpass;
  58.  
  59. ## allow user to change passwords
  60. if ($form{'ChangePassword'} eq 'yes') {
  61.     $warn = &Architext'errorIcon($attr{'ArchitextURL'});
  62.     $message = "";
  63.     if ((! $form{'first'}) && ($form{'pass1'} eq $form{'pass2'})) {
  64.     $newpass = $form{'pass1'};
  65.     $message = "Password cannot contain the '#' character."
  66.         if ($newpass =~ /\#/);
  67.     $message = "Password cannot contain whitespace characters."
  68.         if ($newpass =~ /\s/);
  69.     ## password is legal, let user know it has been changed
  70.     if (! $message) {
  71.         &Architext'printHeader($attr{'ArchitextURL'}, "Password Changed");
  72.         &Architext'updatePassword($root, $newpass, $form{'db'});
  73.         &make_files_readwriteable("$root/Architext.conf");
  74.         print <<EOF;
  75. <b>Your password has been updated.</b>
  76.  
  77. <FORM ACTION="AT-admin$script_suffix" METHOD=POST>
  78. <INPUT TYPE="hidden" NAME="db" VALUE="$form{'dbname'}">
  79. <INPUT TYPE="submit" NAME="Admin" VALUE="Main Admin Page">
  80. Go back to the main administration page.
  81. $postpass
  82. </FORM><BR>
  83.  
  84. EOF
  85.     ;
  86.         &Architext'Copyright($attr{'ArchitextURL'});
  87.         exit(0);
  88.     }
  89.     } else {
  90.     $message = "Passwords didn't match." unless ($message ||
  91.                              ($form{'first'} eq 'yes'));
  92.     }
  93.     ## give user screen to change password for admin or collection
  94.     &Architext'printHeader($attr{'ArchitextURL'}, "Change Password");
  95.     $message = "$warn$message" if $message;
  96.     print <<EOF;
  97. <h2>$message</h2>
  98. <p>Please enter the new password in the spaces provided below. 
  99.  
  100. <FORM ACTION="AT-config$script_suffix" METHOD="POST">
  101. Enter the password here:<br>
  102. <INPUT NAME="pass1" TYPE="password" SIZE=30>
  103. <p>Enter it again:<br>
  104. <INPUT NAME="pass2" TYPE="password" SIZE=30>
  105. <INPUT TYPE="hidden" NAME="ChangePassword" VALUE="yes">
  106. <INPUT TYPE="hidden" NAME="dbname" VALUE="$form{'db'}">
  107. <INPUT TYPE="hidden" NAME="db" VALUE="$form{'db'}">
  108. <p>
  109. <INPUT TYPE="submit" VALUE="Update Password">  Save the new password.
  110. $postpass
  111. </FORM>
  112.  
  113. <p>
  114. <FORM ACTION="AT-admin$script_suffix" METHOD=POST>
  115. <INPUT TYPE="submit" NAME="Admin" VALUE="Main Admin Page">
  116. Don't save, go back to the main administration page.
  117. $postpass
  118. </FORM><BR>
  119. EOF
  120.     ;
  121.     &Architext'Copyright($attr{'ArchitextURL'});
  122.     exit(0);
  123. }
  124.  
  125. ## don't allow access if user leaves collection name blank from admin page
  126. if ($form{'admin'} eq 'admin') {
  127.     if (! $form{'new'}) {
  128.     &Architext'printHeader($attr{'ArchitextURL'}, "");
  129.     &Architext'exitError($attr{'ArchitextURL'},
  130.                  "<b>You must provide a name for a new collection.</b>", $postpass);
  131.     }
  132. }
  133.  
  134.  
  135. if ($form{'Update'}) {
  136.     ## Assuming all the relevant configuration options are specified
  137.     ## as form arguments, this mode actually writes the db.conf file.
  138.     ## will notify user if required information is missing from
  139.     ## the form by passing a message to the next page
  140.     ## Header again
  141.     ## wrote the http header first to prevent mailer errors from
  142.     ## causing a server error
  143.     &Architext'printHttpHeader;
  144.     if (! ($error_str = &createDbConf())) {
  145.     &Architext'printHeader($attr{'ArchitextURL'}, "Collection Configuration", "Collection Configuration", 'none');
  146.  
  147.     if (!$form{'dbname'}) { 
  148.         &Architext'exitError($attr{'ArchitextURL'},
  149.                  "Configure specified with no dbname."); }
  150.     
  151.     ## Let the user know the update was a success.
  152.     print "<H2>Configuration successful</H2>\n";
  153.     print "<p><hr>\n";
  154.     if ($getpass) {
  155.         $getpass .= "&";
  156.     } else {
  157.         $getpass = "?";
  158.     }
  159.     $getpass .= "db=$form{'dbname'}";
  160.     print <<EOF;
  161. <b>Possible Actions:</b>
  162. <p> <FORM ACTION="AT-index$script_suffix" METHOD=POST>
  163. <INPUT TYPE="submit" NAME="Indexing" VALUE="Index">
  164. Create an index for this collection.
  165. <INPUT TYPE="hidden" NAME="db" VALUE="$form{'dbname'}">
  166. $postpass
  167. </FORM>
  168.  
  169. <p> 
  170. <FORM ACTION="AT-generate$script_suffix" METHOD=POST>
  171. <INPUT TYPE="submit" NAME="Generation" VALUE="Generate">
  172. Generate search pages for this collection.
  173. <INPUT TYPE="hidden" NAME="db" VALUE="$form{'dbname'}">
  174. $postpass
  175. </FORM>
  176.  
  177. <p> 
  178. <FORM ACTION="AT-admin$script_suffix" METHOD=POST>
  179. <INPUT TYPE="hidden" NAME="db" VALUE="$form{'dbname'}">
  180. <INPUT TYPE="submit" NAME="Admin" VALUE="Admin">
  181. Go back to the main admin page for this collection.
  182. $postpass
  183. </FORM><BR>
  184. EOF
  185.     ;
  186.  
  187.     &Architext'Copyright($attr{'ArchitextURL'}); 
  188.     exit(0);
  189.     } else {
  190.     ## required elements were not passed in...
  191.     $message = $error_str;
  192.     $form{'db'} = $form{'dbname'};
  193.     }
  194. }
  195.  
  196. if ($form{'new'}) {
  197.     ## Print out a form to allow the user to create a new database.
  198.     $form{'new'} =~ s/\W+/_/g;
  199.  
  200.     ## check to see if user has entered name of existing db
  201.     opendir(CONF, "$root/collections");
  202.     @dbconf = grep(/\.conf$/, readdir(CONF));
  203.     for (@dbconf) {
  204.     s|\.conf$||;
  205.     $preexist = 1 if ($form{'new'} eq $_);
  206.     last if $preexist;
  207.     }
  208.  
  209.     if (! $preexist) {
  210.     ## Our standard header
  211.     ## VL -- this block fixed extra content-type bug
  212.     if ($form{'Update'})    
  213.     {
  214.     &Architext'printHeader($attr{'ArchitextURL'}, 
  215.                    "Configure New Collection: $form{'new'}",
  216.                    "Configure New Collection: $form{'new'}",
  217.                     'none');
  218.     } else
  219.     {
  220.     &Architext'printHeader($attr{'ArchitextURL'}, 
  221.                    "Configure New Collection: $form{'new'}");
  222.  
  223.     }
  224.     ## fixed code end 
  225.     $warn = &Architext'errorIcon($attr{'ArchitextURL'});
  226.     print "<p>$warn<b>ATTENTION: $message Please try again.</b>" if $message;
  227.     
  228.     ## Read the default configuration information.
  229.     ##%attr = &ArchitextConf'readConfig("$root/Architext.conf");
  230.     
  231.     ## Print the form.
  232.     &printForm($form{'new'}, $form{'new'});
  233.     &Architext'Copyright($attr{'ArchitextURL'});
  234.     exit(0);
  235.     } else {
  236.     $form{'db'} = $form{'new'};
  237.     $message = "<b>You chose a name for the new collection that was already in use by an existing collection.</b>  Go back if you want to create a new collection, otherwise, you can now configure the collection whose name you specified.";
  238.     %attr = &ArchitextConf'readConfig("$root/Architext.conf", $form{'db'});
  239.   ## VL - Added this to fix create with same index name bug
  240.   &Architext'printHttpHeader;
  241.     }
  242.     
  243. }  
  244. if ($form{'db'}) {
  245.     ## Print out configuration options for an already-existing
  246.     ## database, and allow the user to update the options.
  247.  
  248.     ## Dump our standard header
  249.     &Architext'printHeader($attr{'ArchitextURL'}, 
  250.                "Collection Configuration: $form{'db'}", 
  251.                "Collection Configuration: $form{'db'}", 
  252.                $message);
  253.  
  254.     $warn = &Architext'errorIcon($attr{'ArchitextURL'});
  255.     ## print a message from the Update mode if something was missing
  256.     print "$warn<b>ATTENTION: $message</b>" if $message;
  257.  
  258.     ## Check for the desired database.conf file.
  259.     $dbconfig = $root . "/collections/" . $form{'db'} . ".conf";
  260.     if (! -r $dbconfig) { 
  261.     &Architext'exitFileError($dbconfig, "does not exist"); 
  262.     }
  263.  
  264.     ## Read all the configuration information.
  265.     ##%attr = &ArchitextConf'readConfig("$root/Architext.conf", $form{'db'});
  266.  
  267.     ## Print the form.
  268.     &printForm($form{'db'});
  269.     &Architext'Copyright($attr{'ArchitextURL'});
  270.     
  271. } else { 
  272.   ## Print out the top-level screen: scan the root directory for 
  273.   ## db.conf files, and allow the user to initialize a new db.conf file.
  274.  
  275.     opendir(CONF, "$root/collections");
  276.     @dbconf = grep(/\.conf$/, readdir(CONF));
  277.  
  278.     &Architext'printHeader($attr{'ArchitextURL'}, "Collection Configuration");
  279.     print <<EOF;
  280. <FORM ACTION="AT-config$script_suffix" METHOD=POST>
  281. Choose a document collection to configure, or enter a new collection:<P>
  282. <DL>
  283. <DT> Existing 
  284. <a href="${helppath}AT-helpdoc.html#Document Collections">
  285. document collections:</a> <DD>
  286. EOF
  287.     ;
  288.     if ($#dbconf > -1) {
  289.     print "<SELECT NAME=\"db\" SIZE=5>"; 
  290.  
  291.     for (@dbconf) {
  292.         s|\.conf$||;
  293.         next if $_ eq 'Architext';
  294.         print "<OPTION> $_\n";
  295.     }
  296.     print "</SELECT><P>\n";
  297.     } else {
  298.     print "<p>(No document collections found)<p>\n";
  299.     }
  300.  
  301.     print <<EOF;        
  302. <DT> If you wish to configure a 
  303. <a href="${helppath}AT-helpdoc.html#New Collection">
  304. new collection</a> 
  305. please supply a name for it here. <DD> <INPUT NAME="new">
  306. </DL>
  307. <INPUT TYPE="submit" NAME="Configure" VALUE="Configure">
  308. $postpass
  309. </FORM><BR>
  310. EOF
  311.     ;
  312.  
  313.     &Architext'Copyright($attr{'ArchitextURL'});
  314. }
  315.  
  316. ## Prints an input line for a form.
  317. sub printInputLine {
  318.     local($name, $text, $db) = @_;
  319.     local($val);
  320.     local($size);
  321.     $text = $name unless $text;
  322.     $val = eval "\$attr{$name}";
  323.     $val = "$attr{'ArchitextRoot'}/collections/" if $db;
  324.     $val = $form{$name} if $form{$name};
  325.     $size=40;
  326.     $size = (length($val) +10) unless ((length($val) +10) < 40);
  327.     print <<EOF;
  328. <a href="${helppath}AT-helpdoc.html#$text">$text:</a> 
  329. <INPUT NAME="$name" VALUE="$val" SIZE=$size><P>
  330. EOF
  331.     ;
  332. }
  333.  
  334. ## Prints out the Architext form. Uses dynamic scoping to ensure that
  335. ## the values in the %attr array are properly set.
  336. sub printForm {
  337.     local($db, $new) = @_;
  338.     local($files, $rules);
  339.     local($fileval, $ruleval, $filter_html, $filter_both, $notify_check);
  340.     print "<p>Please use absolute pathnames for filenames.\n";
  341.     print qq(<FORM ACTION="AT-config$script_suffix" METHOD=POST>\n);
  342.     &printHiddenLine('CollectionInfo', 'CollectionInfo', "$db.cf");    
  343.     if ($new) {
  344.     print qq(<INPUT TYPE="hidden" NAME="new" VALUE="$new">);
  345.     }
  346.     print "Designate the directory where the index files will be stored.\n";
  347.     print "Make sure there is enough space on the directory to accomodate the index files, which will be about 50 percent of the total size of the files you index during indexing, and 15 percent once indexing has completed.<br>\n";
  348.     &printInputLine('CollectionIndex', 'CollectionIndex', $db);
  349.     $filterstring = "$form{'IndexFilterHTML'}$form{'IndexFilterTEXT'}$form{'IndexFilterBIN'}$form{'IndexFilterCUST'}";
  350.     $ifilter = $filterstring || $attr{'IndexFilter'};
  351.     $ifilter = 'HTMLTEXT' unless $ifilter; ##default to html and text
  352.     $custfilter = $form{'ExclusionRules'} || $attr{'ExclusionRules'};
  353.     $custsize = length($custfilter) + 10;
  354.     $custsize = 50 unless ($custsize > 50);
  355.     if ($ifilter =~ /^Text/) {
  356.     ## These set for back-compatibility reasons
  357.     $filter_text = "CHECKED";
  358.     $filter_html = "CHECKED";
  359.     } 
  360.     if ($ifilter =~ /^HTML/) {
  361.     $filter_html = "CHECKED";
  362.     } 
  363.     if ($ifilter =~ /TEXT/) {
  364.     $filter_text = "CHECKED";
  365.     }
  366.     if ($ifilter =~ /PDF/) {
  367.     $filter_pdf = "CHECKED";
  368.     }
  369.     if (($ifilter =~ /CUST/) || $custfilter) {
  370.     $filter_cust = "CHECKED";
  371.     }
  372.  
  373.     
  374.     $form{'FileListCheck'} = 'yes' if ($attr{'CollectionsContents'} =~ /^\+/);
  375.     $files = "CHECKED" if ($form{'FileListCheck'} ||
  376.                $attr{'FileList'} || $form{'FileList'});
  377.     $rules = "CHECKED" if (($attr{'CollectionContents'} # 
  378.                 && ($attr{'CollectionContents'} !~ /^\+/))
  379.                || $form{'FileSource'}); 
  380.     if ($files) {        
  381.     $fileval = $form{'FileList'} || $attr{'FileList'};
  382.     $fileval2 = $attr{'CollectionContents'} if ($attr{'CollectionContents'} =~ /^\+/);
  383.     $fileval = $fileval2 unless $fileval; 
  384.     $fileval =~ s/^\+//;    
  385.     }                
  386.  
  387.     $ccontents = $form{'CollectionContents'};
  388.     if (! $form{'CollectionContents'}) {
  389.     $ccontents = $attr{'CollectionContents'} unless
  390.         ($attr{'CollectionContents'} =~ /^\+/);
  391.     }
  392.     
  393.  
  394.     $ruleval = join("\n", &splitFileList($ccontents)) if $rules;
  395.  
  396.     $notify_check = "CHECKED" if ((-e "$root/collections/$form{'db'}.pub") ||
  397.                                   ($form{'notify'} eq "NOTIFY"));
  398.  
  399. print <<EOF;
  400. <hr>
  401. <b> Choose the Files to Index </b>
  402. <p> Describe the <a href="${helppath}AT-helpdoc.html#CollectionContents">
  403. CollectionContents</a> (the files you wish to index) using any combination
  404. of the three options provided below:
  405. <p><INPUT TYPE="checkbox" NAME="FileSource" VALUE="FileSource" $rules>
  406. <b> Enter the Files to Index Directly into this Form</b><ul>
  407. Index the files and directories listed here: <br>
  408. <TEXTAREA NAME="CollectionContents" ROWS=4 COLS=60>$ruleval</TEXTAREA></ul>
  409. <p><INPUT TYPE="checkbox" NAME="FileListCheck" VALUE="FileList" $files>
  410. <b> Index Using File List </b><ul>
  411. Index the files and directories listed in the following file:
  412. <INPUT NAME="FileList" VALUE="$fileval" SIZE=30><br>
  413. Filenames must be listed using absolute pathnames, with one
  414. filename per line.
  415. </ul>
  416. EOF
  417.     ;
  418.     ##indexing option to allow index of ~user dirs
  419.     if (&Architext'indexUserDirs() && (! ($ews_port eq 'NT'))) {
  420.     $user_val = 'CHECKED' if ($form{'user_dirs'} || $attr{'PublicHtml'});
  421.     $public_html = $form{'PublicHtml'} || $attr{'PublicHtml'} ||
  422.         'public_html';
  423.     $pub_size = length($public_html) + 10;
  424.     print <<EOF;
  425. <INPUT TYPE="checkbox" NAME="user_dirs" VALUE="yes" $user_val>
  426. <b> Index ~user Directories</b>
  427. <ul>
  428.     In addition to the files specified above, index the files in
  429. the following subdirectory of each user's home directory:
  430. <INPUT NAME="PublicHtml" VALUE="$public_html" SIZE="$pub_size">
  431. </ul>
  432. EOF
  433.     ;
  434.     }
  435.     print <<EOF;
  436. <hr>
  437. <b>Index Filter</b>
  438. <ul>Configure the <a href="${helppath}AT-helpdoc.html#IndexFilter">
  439. IndexFilter</a> (the types of files you wish to include in 
  440. the index.):<br>
  441. <INPUT TYPE="checkbox" NAME="IndexFilterHTML" VALUE="HTML" $filter_html>
  442. HTML Files (filenames with a <b>.*htm*</b> suffix)<br>
  443. EOF
  444. ;
  445.     &Architext'additionalOptions($filter_pdf);
  446.     print <<EOF;
  447. <INPUT TYPE="checkbox" NAME="IndexFilterTEXT" VALUE="TEXT" $filter_text>
  448. Text Files<br>
  449. <INPUT TYPE="checkbox" NAME="IndexFilterCUST" VALUE="CUST" $filter_cust>
  450. Files that match user-defined expressions in the 
  451. <a href="${helppath}AT-helpdoc.html#Custom Filter File">Custom Filter File</a>
  452. designated below:
  453. <ul><INPUT NAME="ExclusionRules" VALUE="$custfilter" SIZE=$custsize></ul>
  454. </ul>
  455. <p>
  456. </ul>
  457. <hr>
  458. EOF
  459.     ;
  460.     if (&Architext'inlineSummaryMode()) {
  461.     $fast_check = "CHECKED" 
  462.         if (($form{'SummaryMode'} eq 'fast') ||
  463.         ($attr{'SummaryMode'} eq 'fast'));
  464.     $q_check = "CHECKED" 
  465.         if (($form{'SummaryMode'} eq 'quality') ||
  466.         ($attr{'SummaryMode'} eq 'quality'));
  467.     print <<EOF;
  468. <a href="${helppath}AT-helpdoc.html#Summary Mode"><b>Summary Mode</b></a><br>
  469. <ul>
  470. Choose a summary mode.  Summaries are generated at indexing time, and 
  471. therefore impact indexing speed.<br>
  472. <INPUT TYPE="RADIO" NAME="SummaryMode" VALUE="fast" $fast_check>
  473. Fast summaries.  (Just the first few lines from the file.)<br>
  474. <INPUT TYPE="RADIO" NAME="SummaryMode" VALUE="quality" $q_check>
  475. Quality summaries.  (These summaries are calculated using excite's
  476. summarization technology.  These are generally better descriptions than
  477. the first two lines of the file, but do slow down indexing a bit.
  478. </ul>
  479. <hr>
  480. EOF
  481.     ;
  482.     }
  483.     if (&Architext'externalSitesMode()) {
  484.         $spider_dir = $form{'SpiderDir'} || $attr{'SpiderDir'};
  485.         $spider_dir_length = length($spider_dir);
  486.         $spider_dir_length = 30 if ($spider_dir_length < 30); 
  487.         print <<EOF;
  488. <a href="${helppath}AT-helpdoc.html#Spider Directory">
  489. <b>Spider Directory</b></a><br>
  490. <ul>
  491. Enter the name of a directory where the spider's output is stored:
  492. <INPUT NAME="SpiderDir" VALUE="$spider_dir" SIZE="$spider_dir_length">
  493. </ul>
  494. <hr>
  495. EOF
  496.     ;
  497.     }
  498.  
  499.     if (&Architext'notifyMode()) {
  500. print <<EOF;
  501. <INPUT TYPE="checkbox" NAME="notify" VALUE="NOTIFY" $notify_check>
  502. <b> Participate in excite <a href=\"${helppath}AT-helpdoc.html#Notifier\">notifier</a></b>
  503. <ul>
  504. Please provide an email address below that works from outside your site.
  505. <br>
  506. </ul>
  507. <hr>
  508. EOF
  509.     ;
  510. }
  511. if (&os_name() eq 'NT') {
  512.     $server_name = $ENV{'SERVER_NAME'};
  513.     $server_name =~ s/\..*$//g;
  514.     print <<EOF;
  515. If you would like to be notified via the NT Messenger Service 
  516. when an indexing process on this collection completes, provide a hostname 
  517. here.  <b><i>Please be sure that the NT Messenger Service is
  518. running on that machine.</b></i>
  519. <br>
  520. <a href="${helppath}AT-helpdoc.html#IndexingContact">
  521. IndexingContact:</a>
  522. <INPUT NAME="AdminMail" SIZE=40 VALUE="$server_name">
  523. EOF
  524.     ;
  525.     } else {
  526.     $admin_mail = $form{'AdminMail'} || $attr{'AdminMail'};
  527.     print <<EOF;
  528. <p>If you would like to receive email notification when the indexing 
  529. process completes, provide an address here.<br>
  530. <a href="${helppath}AT-helpdoc.html#IndexingContact">
  531. IndexingContact:</a>
  532. <INPUT NAME="AdminMail" SIZE=40 VALUE="$admin_mail">
  533. EOF
  534.     ;
  535.     }
  536.     if (&Architext'customFormat()) {
  537.     $title_delimiter = $form{'TitleDelimiter'} || $attr{'TitleDelimiter'};
  538.     $doc_delimiter = $form{'DocumentDelimiter'} || 
  539.         $attr{'DocumentDelimiter'};
  540.     $dd_size = 
  541.         (length($doc_delimiter) > 30) ? length($doc_delimiter)+5 : 30;
  542.     $td_size = 
  543.         (length($title_delimiter) > 30) ? length($title_delimiter)+5 : 30;
  544.     
  545.     print <<EOF;
  546. <hr> <b> Custom Document Format Information </b>
  547. <ul>
  548. Specify the <a href="${helppath}AT-helpdoc3.html#Document Delimiter">
  549. document delimiter</a>: <INPUT NAME="DocumentDelimiter"
  550. VALUE="$doc_delimiter" SIZE=$dd_size>
  551. <p>Specify the <a href="${helppath}AT-helpdoc3.html#Title Delimiter">
  552. title field delimiter</a>: <INPUT NAME="TitleDelimiter" 
  553. VALUE="$title_delimiter" SIZE=$td_size>
  554. </ul>
  555. EOF
  556.     ;
  557.     }
  558.     print <<EOF;
  559. <hr>
  560. <b>Possible Actions:</b>
  561. <p><INPUT TYPE="submit" NAME="Set" VALUE="Save">
  562. Save the configuration characteristics for this collection.
  563. <INPUT TYPE="hidden" NAME="Update" VALUE="Update">
  564. <INPUT TYPE="hidden" NAME="dbname" VALUE="$db">
  565. <INPUT TYPE="hidden" NAME="db" VALUE="$db">
  566. $postpass
  567. </FORM><BR>
  568. EOF
  569.     ;
  570.  
  571.     if (-e "$root/collections/$db.conf") {
  572.     $dbline = "<INPUT TYPE=\"hidden\" NAME=\"db\" VALUE=\"$db\">";
  573.     }
  574.     print <<EOF;
  575. <p> 
  576. <FORM ACTION="AT-admin$script_suffix" METHOD=POST>
  577. $dbline
  578. <INPUT TYPE="submit" NAME="Admin" VALUE="Admin">
  579. Don't save, go back to the admin page.
  580. $postpass
  581. </FORM><BR>
  582. EOF
  583.     ;
  584. }
  585.  
  586. ## pass around all the parameters that user doesn't need to see
  587. sub printHiddenLine {
  588.     local($name, $value, $dummy) = @_;
  589.     if (!&Architext'debugMode())
  590.     {
  591.     $val = eval "\$attr{$name}";
  592.     $val = "$attr{'ArchitextRoot'}/collections/$dummy" if $dummy;
  593.     print qq(<INPUT TYPE="hidden" NAME="$name" VALUE="$val">);
  594.     }
  595.     else
  596.     {
  597.     &printInputLine($name, $value, $dummy);
  598.     }                
  599. }
  600.  
  601.  
  602. ## writes a db conf file to disk and does some error checking
  603. ## to make sure that the user has entered sensible values.
  604. ## also adds the AdminMail field to Architext.conf if it is
  605. ## not already there, so that it will be defaulted in the
  606. ## future
  607. sub createDbConf {
  608.     local($dbconfig, $message, $collection_root, $exit, @index);
  609.     local($n_do, $n_exist, $n_mail, $n_port, $n_server, $n_cgdir, %n_attr);
  610.     if (!$form{'CollectionIndex'}) {
  611.     return "You cannot leave the 'CollectionIndex' field blank.";
  612.     } 
  613.     return "You must choose the files you wish to index." 
  614.     unless ($form{'user_dirs'} || $form{'FileListCheck'} ||
  615.         $form{'FileSource'} || $form{'SpiderDir'});
  616.     if ($form{'FileListCheck'}) {
  617.     return "You must supply a filename for the file list." 
  618.         unless $form{'FileList'};
  619.     return "The file list file '$form{'FileList'}' does not exist."
  620.         unless (-e $form{'FileList'});
  621.     return "The file list file '$form{'FileList'}' is not readable."
  622.         unless (-r $form{'FileList'});
  623.     }
  624.     if ($form{'FileSource'}) {
  625.     return "You must supply filenames for the files you wish to index."
  626.         unless $form{'CollectionContents'};
  627.     }
  628.     ## add rootnmame to collection index path
  629.     $dbconfig = $root . "/collections/" . $form{'dbname'} . ".conf";
  630.     $form{'CollectionIndex'} .= "/" unless $form{'CollectionIndex'} =~ /\/$/;
  631.     $collection_root = "$form{'CollectionIndex'}$form{'dbname'}";
  632.     ## Can we write to the db.conf file?
  633.     if (-e $dbconfig && ! -w $dbconfig) {
  634.     &Architext'printHeader($attr{'ArchitextURL'}, "Error");
  635.     &Architext'exitFileError($attr{'ArchitextURL'}, 
  636.                  $dbconfig, "is not writable.");
  637.     }
  638.  
  639.     if ($form{'SpiderDir'}) {
  640.     return "The spider output directory '$form{'SpiderDir'}' does not exist." unless (-e $form{'SpiderDir'});
  641.     return "The spider output directory '$form{'SpiderDir'}' is not a directory" unless (-d $form{'SpiderDir'});
  642.     }
  643.  
  644.     ## test user's entries to make sure they are valid
  645.     ## makes sense and will not be likely to kill the indexing
  646.     ## process.
  647.     if ($form{'user_dirs'}) {
  648.     return "You must provide a name for the subdirectory where user's HTML files are stored." unless $form{'PublicHtml'};
  649.     }
  650.     return "The index binary '$attr{'IndexExecutable'}' does not exist."
  651.     if ((! -e $attr{'IndexExecutable'}) && 
  652.         (! -e "$attr{'IndexExecutable'}.exe"));
  653.     return "The  search binary '$attr{'SearchExecutable'}' does not exist."
  654.     if ((! -e $attr{'SearchExecutable'}) &&
  655.         (! -e "$attr{'SearchExecutable'}.exe"));
  656.     return "The stem table '$attr{'StemTable'}' is not readable."
  657.     if (! -r $attr{'StemTable'}); 
  658.     return "The stop table '$attr{'StopTable'}.key' is not readable."
  659.     if (! -r "$attr{'StopTable'}.key");  
  660.     return "The stop table '$attr{'StopTable'}.ptr' is not readable."
  661.     if (! -r "$attr{'StopTable'}.ptr"); 
  662.     return "The CollectionIndex directory you specified ($form{'CollectionIndex'}) does not exist."
  663.     if (! -e $form{'CollectionIndex'});
  664.     return "The CollectionIndex directory you specified ($form{'CollectionIndex'}) is not a directory."
  665.     if (! -d $form{'CollectionIndex'});
  666.     return "The CollectionIndex directory you specified ($form{'CollectionIndex'}) is not writeable."
  667.     if (! -w $form{'CollectionIndex'});
  668.     return "You must choose at least one of the IndexFilter options."
  669.     unless ($form{'IndexFilterHTML'} || $form{'IndexFilterTEXT'}
  670.         || $form{'IndexFilterBIN'} || $form{'IndexFilterCUST'}
  671.         || $form{'IndexFilterPDF'});
  672.     if (($form{'IndexFilterCUST'}) && (!$form{'ExclusionRules'})) {
  673.     return "You must supply the name of Custom Filter File.";
  674.     }
  675.     if ($form{'ExclusionRules'} && ($form{'IndexFilterCUST'})) {
  676.     return "The Custom Filter File you specified ($form{'ExclusionRules'}) does not exist."
  677.         if (! -e $form{'ExclusionRules'});
  678.     return "The Custom Filter File you specified ($form{'ExclusionRules'}) is not readable."
  679.         if (! -r $form{'ExclusionRules'});
  680.     }
  681.     if ($form{'FileListCheck'}) {
  682.     return "You must provide the name of a file list." 
  683.         unless ($form{'FileList'});
  684.     return 
  685.         "The file list '$form{'FileList'}' you specified does not exist." 
  686.         unless (-e $form{'FileList'});    
  687.     $form{'FileList'} =~ s/^\s+//;
  688.     $form{'FileList'} =~ s/\s+$//;
  689.     return "Please specify only one file list file." if ($form{'FileList'} =~ /\S\s\S/);
  690.     } else {
  691.     $form{'CollectionContents'} = join(" ", &splitFileList($form{'CollectionContents'}));
  692.     }
  693.     %url_maps = &ArchitextMap'getMappings($attr{'HtmlRoot'}, "$root/url.map");
  694.     @index = &splitFileList($form{'CollectionContents'});
  695.     for (@index) {
  696.     if (/^\+/) {
  697.         if ($form{'FileSource'} eq 'Files') {
  698.         return "Bad filename given.  ($_) Please use absolute pathnames.";
  699.         }
  700.         s/^\+//;
  701.         return "Could not find file list '$_'.  Please re-enter the file list filename."
  702.         if (! -e $_);
  703.         return "Could not read from file list '$_'.  Please re-enter the file list filename."
  704.         if (! -r $_);
  705.         ## check to to enforce files in file list appear under html root
  706.         open(FLIST, "$_");
  707.         while (<FLIST>) {
  708.         if (! &Architext'underRoot($_, $ews_port || '*', %url_maps)) {
  709.             close(FLIST);
  710.             return "The file '$_' specified in the file list does not appear under your html root directory or any of the directories mentioned in your URL Mapping configuration.  Please specify files that appear under these directories, or your Web server will not have access to them.";
  711.         }
  712.         }
  713.         close(FLIST);
  714.     } else {
  715.         ## check here to enforce that files appear under html root
  716.         return "Specified file or directory '$_'  does not appear under your html root directory or any of the directories mentioned in your URL Mapping configuration.  Please specify files that appear under your these directories, or your Web server will not have access to them." unless &Architext'underRoot($_, $ews_port || '*', %url_maps);
  717.         return "Specified file or directory '$_' does not exist.  Please re-enter the list of files to index."
  718.         if (! -e $_);
  719.         return "Could not read from the specified file or directory '$_'.  Please re-enter the list of files to index."
  720.         if (! -r $_); 
  721.     }
  722.     }
  723.     
  724.     if (&Architext'notifyMode()) {
  725.  
  726.     $n_do = 0;
  727.     $n_exist = 0;
  728.     $n_do = 1 if ($form{'notify'} eq "NOTIFY");
  729.     $n_exist = 1 if (-e "$root/collections/$form{'dbname'}.pub");
  730.     
  731.     $n_mail = $form{'AdminMail'};
  732.     $n_port = $ENV{'SERVER_PORT'} || $attr{'ServerPort'}; 
  733.     $n_server = $attr{'ServerName'};
  734.     $n_cgdir  = $attr{'ServerCgi'};
  735.     $n_server = $n_server . ":" . $n_port if ($n_port);
  736.     
  737.     if ($n_exist && !$n_do) {
  738.         unlink "$root/collections/$form{'dbname'}.pub";
  739.         
  740.         &ArchitextNotify'notify($form{'dbname'}, "OFF");
  741.         
  742.         $mailapp = &mailer($root);
  743.         open(MAIL, "| $mailapp ews_notify\@atext.com");
  744.         print MAIL "To: ews_notify\@atext.com\n";
  745.         print MAIL "Subject: Architext notifier UNSUBSCRIBE\n";
  746.         print MAIL "Collection: $form{'dbname'}\n";
  747.         print MAIL "Server: $n_server\n";
  748.         print MAIL "CgiBin: $n_cgdir\n";
  749.         print MAIL "AdminMail: $n_mail\n";
  750.         close MAIL;
  751.     }
  752.     
  753.     if ($n_do && !$n_exist) {
  754.         if ($form{'AdminMail'} !~ /\@/) {
  755.         return "Please supply an email address that works from outside your organization when choosing to participate in the notifier";
  756.         }
  757.         if (! open(TMP, ">$root/collections/$form{'dbname'}.pub")) {
  758.         &Architext'exitFileError($attr{'ArchitextURL'}, 
  759.                      "$root/collections/$form{'dbname'}.pub",
  760.                      "could not be opened for writing."); 
  761.         }
  762.         close TMP;
  763.         
  764.         &ArchitextNotify'notify($form{'dbname'}, "ON");
  765.         
  766.         open(MAIL, "| mail ews_notify\@atext.com");
  767.         print MAIL "To: ews_notify\@atext.com\n";
  768.         print MAIL "Subject: Architext notifier SUBSCRIBE\n";
  769.         print MAIL "Collection: $form{'dbname'}\n";
  770.         print MAIL "Server: $n_server\n";
  771.         print MAIL "CgiBin: $n_cgdir\n";
  772.         print MAIL "AdminMail: $n_mail\n";
  773.         close MAIL;
  774.         
  775.     }
  776.     
  777.     }
  778.     
  779.     if (! open(DBCONF, ">$dbconfig")) {
  780.     &Architext'exitFileError($attr{'ArchitextURL'}, 
  781.                  $dbconfig, 
  782.                  "could not be opened for writing."); 
  783.     }                
  784.     
  785.     ## now that everything has been tested for accuracy, write to disk
  786.     print DBCONF "<Collection $form{'dbname'}>\n";
  787.     for ('CollectionIndex', 'CollectionInfo') {
  788.     print DBCONF "$_ $form{$_}\n"; 
  789.     }
  790.     $filterstring = "$form{'IndexFilterHTML'}$form{'IndexFilterTEXT'}$form{'IndexFilterBIN'}$form{'IndexFilterCUST'}$form{'IndexFilterPDF'}";
  791.     print DBCONF "IndexFilter $filterstring\n";
  792.     $form{'CollectionContents'} = "" unless $form{'FileSource'};
  793.     print DBCONF "CollectionContents $form{'CollectionContents'}\n";
  794.     print DBCONF "FileList $form{'FileList'}\n" if $form{'FileListCheck'};
  795.     if ($form{'user_dirs'}) {
  796.     &generateUserFile("$root/collections/$form{'dbname'}.usr",
  797.               $form{'PublicHtml'});
  798.     print DBCONF "PublicHtml $form{'PublicHtml'}\n";
  799.     }
  800.     print DBCONF "CollectionRoot $collection_root\n";
  801.     print DBCONF "AdminMail $form{'AdminMail'}\n";
  802.     print DBCONF "ExclusionRules $form{'ExclusionRules'}\n" if ($form{'ExclusionRules'} && $form{'IndexFilterCUST'});
  803.     print DBCONF "SpiderDir $form{'SpiderDir'}\n" if $form{'SpiderDir'};
  804.     if ($form{'SummaryMode'}) {
  805.     print DBCONF "SummaryMode $form{'SummaryMode'}\n";
  806.     $num_sum_sent = &Architext'numSumSent();
  807.     print DBCONF "NumSumSent $num_sum_sent\n";
  808.     }
  809.     if (&Architext'customFormat()) {
  810.     print DBCONF "DocumentDelimiter $form{'DocumentDelimiter'}\n" 
  811.         if $form{'DocumentDelimiter'};
  812.     print DBCONF "TitleDelimiter $form{'TitleDelimiter'}\n"
  813.         if $form{'TitleDelimiter'};
  814.     if ($form{'TitleDelimiter'} || $form{'DocumentDelimiter'}) {
  815.         if (! open(CUSTOM, ">$root/collections/$form{'dbname'}.cus")) {
  816.         &Architext'printHeader($attr{'ArchitextURL'}, "Error");    
  817.         &Architext'exitFileError($attr{'ArchitextURL'},
  818.                      "$root/collections/$form{'dbname'}.cus",
  819.                      "Could not be opened for writing");
  820.         }
  821.         print CUSTOM "$form{'DocumentDelimiter'}\n";
  822.         print CUSTOM "$form{'TitleDelimiter'}\n";
  823.         close(CUSTOM);
  824.     }
  825.     }
  826.     print DBCONF "ServerPort $ENV{'SERVER_PORT'}\n";
  827.     print DBCONF "</Collection>\n";
  828.     close(DBCONF);
  829.     ## put AdminMail in Architext.conf if it is not already there
  830.     if ($form{'AdminMail'} && (! $attr{'AdminMail'})) {
  831.     $exit = &append_line_to_file("$root/Architext.conf", 
  832.                      "AdminMail $form{'AdminMail'}");
  833.     &Architext'exitError($attr{'ArchitextURL'},
  834.                  "Error updating Architext.conf with AdminMail - $!") if $exit;
  835.     }
  836.     return($message);
  837. }
  838.  
  839. ## grabs user info from /etc/passwd for indexing of
  840. ## user's public_html directories
  841. sub generateUserFile {
  842.     local($filename, $subdir) = @_;
  843.     local($user, $dir, $file, $filename2);
  844.     local(%homedirs) = &getHomeDirs();
  845.     $filename2 = $filename;
  846.     $filename2 .= "2";
  847.     unlink($filename);
  848.     unlink($filename2);
  849.     open(USERFILE, ">$filename");
  850.     open(UFILE, ">$filename2");
  851.     foreach $user (keys %homedirs) {
  852.     $file = $homedirs{$user};
  853.     $file .= "/" unless ($file =~ /\/$/);
  854.     $file .= $subdir;
  855.     $file .= "/" unless ($file =~ /\/$/);
  856.     if (-e $file) {
  857.         print USERFILE "~$user $file\n";
  858.         print UFILE "$file\n";
  859.     }
  860.     }
  861.     close(USERFILE);
  862.     close(UFILE);
  863. }
  864.  
  865. ## gets the home directories for all the users on the server
  866. sub getHomeDirs {
  867.     local(%homes);
  868.     local($name, $passwd, $uid, $gid, $quota, $comment, $gcos, $dir, $shell);
  869.     local($members);
  870.     # local($group) = "sysadmin";
  871.     local($group) = "real";
  872.     ($name, $passwd, $gid, $members) = getgrnam($group);
  873.     if ($name eq $group) {
  874.         local(@members) = split(/\s/, $members);
  875.         foreach $name (@members) {
  876.             ($name, $passwd, $uid, $gid, $quota, $comment, $gcos, $dir, $shell) = getpwnam($name);
  877.             $homes{$name} = $dir if $name;
  878.         }
  879.     }
  880.     else {
  881.         while (($name, $passwd, $uid, $gid, $quota, $comment, $gcos, $dir, $shell) = getpwent) {
  882.             next if $passwd eq "*";
  883.             next unless $shell =~ /sh$/;
  884.             next if $dir eq "/";
  885.             next if $dir =~ /tmp/; 
  886.             next unless ((-f "$dir/.cshrc") || (-f "$dir/.login")); 
  887.             $homes{$name} = $dir; 
  888.         }
  889.         ##endpwent; ## perl bug?  causes bad free().
  890.     }
  891.     %homes;
  892. }
  893.  
  894.  
  895.  
  896.